class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) 
    {
        vector<int> ret;
        unordered_map<string,int> hash1;

        for(auto& e: words) 
            hash1[e]++;

        int len = words[0].size(), n = words.size();

        //滑动窗口次数
        for(int i = 0; i < len; i++)
        {
            unordered_map<string,int> hash2;
            for(int left = i, right = i,count = 0; right < s.size(); right+=len)
            {
                //进窗口,并维护count
                string in = s.substr(right,len);
                hash2[in]++;
                if(hash1.count(in) && hash2[in] <= hash1[in])
                    count++;
                //判断
                if(right - left + 1 > len * n)
                {
                    string out = s.substr(left,len);
                    if(hash1.count(out) && hash2[out] <= hash1[out])
                        count--;
                    hash2[out]--;
                    left+=len;
                }
                //更新结果
                if(n == count)
                    ret.push_back(left);
            }
        }
        return ret;
    }
};
